﻿using Pe.Petecos.Comercial.Aplicacion.Core.Base;
using Pe.Petecos.Comercial.Aplicacion.Core.ServiceContract;
using Pe.Petecos.Comercial.Aplicacion.TransferObject.Ventas;
using Pe.Petecos.Comercial.Cross.Core.Constantes;
using Pe.Petecos.Comercial.Presentacion.Core.Controllers.Base;
using Pe.Petecos.Comercial.Presentacion.Core.Security;
using Pe.Petecos.Comercial.Presentacion.Core.ViewModel.Ventas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace Pe.Petecos.Comercial.Presentacion.Core.Controllers.Ventas
{
    public class AdministrarComprobantePagoController : GenericController
    {
        public IGeneralService generalService { get; set; }
        public IVentasService ventasService { get; set; }

        #region Action
        /// /// <summary>
        /// Muestra la vista principal
        /// </summary>
        /// <returns>Vista principal de la opción</returns>
        public ActionResult Index()
        {
            var result = generalService.BuscarOpcion(DatosConstantes.Parametro.EstadoComprobantePago).Result;
            var model = new AdministrarComprobantePagoBusquedaModel(result);

            return View(model);
        }

        #endregion

        #region Vistas Parciales
        /// <summary>
        /// Muestra el formulario de datos
        /// </summary>
        /// <returns>Vista FormularioRegistro</returns>
        public ActionResult FormularioRegistro(int codigo)
        {
            var tiposComprobantePago = generalService.BuscarOpcion(DatosConstantes.Parametro.TipoComprobantePago).Result;
            var monedas = generalService.BuscarOpcion(DatosConstantes.Parametro.Moneda).Result;
            var tiposDePagosPorComprobante = generalService.BuscarOpcion(DatosConstantes.Parametro.TipoDePagoComprobantePago).Result;

            var modelo = new AdministrarComprobantePagoRegistroModel(tiposComprobantePago, monedas, tiposDePagosPorComprobante);

            if (codigo > 0)
            {
                var evento = ventasService.ObtenerComprobantePago(codigo).Result;
                modelo.ComprobantePago = evento;
            }

            return View(modelo);
        }

        #endregion

        #region Json

        public JsonResult Buscar(FiltroComprobantePago filtro)
        {
            var resultado = ventasService.BuscarComprobantePago(filtro);
            return Json(resultado);
        }

        public JsonResult Registrar(DataComprobantePago evento)
        {
            var currentAccount = HttpSessionContext.CurrentAccount();
            evento.UsuarioCreacion = currentAccount.Cuenta;
            evento.UsuarioModificacion = currentAccount.Cuenta;

            var resultado = ventasService.RegistrarComprobantePago(evento);
            return Json(resultado);
        }

        public JsonResult Anular(List<int> codigos)
        {
            var currentAccount = HttpSessionContext.CurrentAccount();

            var resultado = ventasService.ModificarEstadoComprobantePago(codigos, DatosConstantes.EstadoComprobantePago.Eliminado, currentAccount.Cuenta);
            return Json(resultado);
        }

        public JsonResult PreAprobar(List<int> codigos)
        {
            ProcessResult<List<int>> resultado = new ProcessResult<List<int>>();

            var currentAccount = HttpSessionContext.CurrentAccount();

            if (currentAccount.CodigoPerfil == DatosConstantes.Perfil.Administrador || currentAccount.CodigoPerfil == DatosConstantes.Perfil.PreAprobador)
            {
                resultado = ventasService.ModificarEstadoComprobantePago(codigos, DatosConstantes.EstadoComprobantePago.PreAprobado, currentAccount.Cuenta);
            }
            else
            {
                resultado.CodeResult = -1;
            }


            return Json(resultado);
        }

        public JsonResult Aprobar(List<int> codigos)
        {

            ProcessResult<List<int>> resultado = new ProcessResult<List<int>>();

            var currentAccount = HttpSessionContext.CurrentAccount();

            if (currentAccount.CodigoPerfil == DatosConstantes.Perfil.Administrador || currentAccount.CodigoPerfil == DatosConstantes.Perfil.Aprobador)
            {
                resultado = ventasService.ModificarEstadoComprobantePago(codigos, DatosConstantes.EstadoComprobantePago.Aprobado, currentAccount.Cuenta);
            }
            else
            {
                resultado.CodeResult = -1;
            }

            return Json(resultado);
        }

        public JsonResult Aceptar(List<int> codigos)
        {

            ProcessResult<List<int>> resultado = new ProcessResult<List<int>>();

            var currentAccount = HttpSessionContext.CurrentAccount();

            if (currentAccount.CodigoPerfil == DatosConstantes.Perfil.Administrador)
            {
                resultado = ventasService.ModificarEstadoComprobantePago(codigos, DatosConstantes.EstadoComprobantePago.Aceptado, currentAccount.Cuenta);
            }
            else
            {
                resultado.CodeResult = -1;
            }

            return Json(resultado);
        }

        //public JsonResult Copiar(int codigo)
        //{
        //    var currentAccount = HttpSessionContext.CurrentAccount();
        //    var cuenta = currentAccount.Cuenta;
        //    var resultado = ventasService.CopiarComprobantePago(codigo, cuenta);
        //    return Json(resultado);
        //}

        #endregion
    }
}
